SQL中GROUP BY语句介绍

您所在的位置:网站首页 group by cno cno必须在哪里 SQL中GROUP BY语句介绍

SQL中GROUP BY语句介绍

2024-07-14 07:20| 来源: 网络整理| 查看: 265

本文主要介绍SQL(Structured Query Language)中GROUP BY语句的相关知识,同时通过用法示例介绍GROUP BY语句的常见用法。

1 概述

GROUP BY语句通常用于配合聚合函数(如COUNT()、MAX()等),根据一个或多个列对结果集进行分组。

从字面上来理解,GROUP表示分组、BY后接字段名,表示根据某个字段进行分组。

一般情况下,GROUP BY必须要配合聚合函数一起使用,通过使用聚合函数,在分组之后可以对组内结果进行计数(COUNT)、求和(SUM),求平均数(AVG)操作等。

常用聚合函数如下:

count():计数sum():求和avg():求平均数max():求最大值min():求最小值 2 常见用法

现有一个数据库表,内容如下:

mysql> select * from roles; +---------+------------+----------+---------------------+ | role_id | occupation | camp | register_time | +---------+------------+----------+---------------------+ | 1 | mage | alliance | 2018-12-03 16:11:28 | | 2 | paladin | alliance | 2018-11-30 16:11:28 | | 3 | rogue | horde | 2018-12-01 16:11:28 | | 4 | priest | alliance | 2018-12-02 16:11:28 | | 5 | shaman | horde | NULL | | 6 | warrior | alliance | NULL | | 7 | warlock | horde | 2018-12-04 16:11:28 | | 8 | hunter | horde | NULL | +---------+------------+----------+---------------------+ 8 rows in set (0.00 sec) mysql>

接下来针对上表通过一些GROUP BY的用法示例,来介绍GROUP BY语句的常见用法。

2.1 结合聚合函数

首先,不使用聚合函数,只使用GROUP BY,查询结果如下:

mysql> select camp,role_id,occupation,register_time from roles group by camp; +----------+---------+------------+---------------------+ | camp | role_id | occupation | register_time | +----------+---------+------------+---------------------+ | alliance | 1 | mage | 2018-12-03 16:11:28 | | horde | 3 | rogue | 2018-12-01 16:11:28 | +----------+---------+------------+---------------------+ 2 rows in set (0.00 sec) mysql>

上述查询结果表明,当不使用聚合函数时,GROUP BY的结果是分组内容中的第一组查询结果。

当然,在实际使用中,通常都需要将GROUP BY与聚合函数结合起来使用,来实现某种目的。

例如,我们想查找“联盟和部落阵营中所有角色最早的注册时间”,则可以通过如下语句实现:

mysql> select camp,MIN(register_time) as register_time from roles group by camp; +----------+---------------------+ | camp | register_time | +----------+---------------------+ | alliance | 2018-11-30 16:11:28 | | horde | 2018-12-01 16:11:28 | +----------+---------------------+ 2 rows in set (0.01 sec) mysql>

上述查询结果表明,通过使用聚合函数“MIN()”,我们找到了每个阵营中最早的注册时间。

2.2 HAVING子句

HAVING子句可以筛选通过GROUP BY分组后的各组数据。

承接上文内容,通过HAVING子句筛选出所有阵营中最早的注册时间,语句如下:

mysql> select camp,MIN(register_time) as register_time from roles group by camp HAVING register_time > '2018-12-01 00:00:00'; +-------+---------------------+ | camp | register_time | +-------+---------------------+ | horde | 2018-12-01 16:11:28 | +-------+---------------------+ 1 row in set (0.00 sec) mysql>

注意:上述语句中HAVING的对象register_time,实际上是前面聚合函数MIN(register_time)的结果集。而由于WHERE子句不能包含聚合函数,所以此处只能使用HAVING子句。如果使用WHERE子句替换HAVING子句,命令会报错,信息如下:

mysql> select camp,MIN(register_time) as register_time from roles group by camp WHERE register_time > '2018-12-01 00:00:00'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE register_time > '2018-12-01 00:00:00'' at line 1 mysql>

HAVING与WHERE的区别:

WHERE子句的作用:在对查询结果进行分组前,把不符合WHERE条件的行去掉,即在分组之前过滤数据。另外,WHERE条件中不能包含聚合函数;HAVING子句的作用:筛选满足条件的组,即在分组后过滤数据,条件中经常包含聚合函数,使用HAVING条件过滤出特定的组。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3